package m;

import core.bd;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.error.ErrorInfo;

/**
 *
 * @author Sebas
 */
public class Model {

    PreparedStatement pt = null;
    ResultSet rsQuery = null;

    // puede usar la misma sql para pasarla a sqlDatos...
    protected int cant(String sql) {
        int c = 0;
        this.pt = null;
        this.rsQuery = null;
        try {
            pt = bd.getConexion().prepareStatement(sql);
            rsQuery = pt.executeQuery();
            while (rsQuery.next()) {
                c++;
            }


        } catch (SQLException e) {
            this.i(e.getMessage());
        }
        return c;
    }

    /**
     * Hacer conteo de Elementos en una Tabla
     *
     * @param sql
     * @return c - Cantidad de Elementos
     */
    protected int count(String sql) {
        System.out.println("sql - count  = " + sql);
        int c = 0;
        this.pt = null;
        this.rsQuery = null;
        try {
            pt = bd.getConexion().prepareStatement(sql);
            rsQuery = pt.executeQuery();
            rsQuery.next();
            c = rsQuery.getInt(1);

        } catch (SQLException e) {
            ErrorInfo ed_infoError = new ErrorInfo("Error", "Problemas Verificando si la Informacion Digitada ya existe en el Sistema", null, "category", e,
                    Level.CONFIG, null);
            JXErrorPane.showDialog(null, ed_infoError);

            c = -1;
        }
        return c;
    }
    /*
     *Ejecuta una consulta y retorna un objeto bidimensional  
     *@version 1.1 
     */

    protected Object[][] sqlDatos(String sql) {

        Object[][] datos = null;
        this.pt = null;
        this.rsQuery = null;
        try {

            pt = bd.getConexion().prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            rsQuery = pt.executeQuery();

            //Enviamos Curso al Final para conocer numro de Filas
            rsQuery.last();
            int nFilas = rsQuery.getRow();


            //Enviamos el Curso al Principio
            rsQuery.beforeFirst();

            int nColum = rsQuery.getMetaData().getColumnCount();

            datos = new Object[nFilas][nColum];
            //System.out.println("nFilas = " + nFilas + " | Columnas = " + nColum);
            int fil = 0;
            while (rsQuery.next()) {
                for (int colum = 0; colum < nColum; colum++) {
                    //System.out.println("rsQuery.getMetaData().getColumnClassName(colum) = " + rsQuery.getMetaData().getColumnClassName(colum + 1));
                    datos[ fil][ colum] = rsQuery.getString(colum + 1) == null ? "" : rsQuery.getString(colum + 1);
                }
                fil++;
            }

        } catch (SQLException e) {
            this.i("SQLException: Util.java (selectSQL) = " + e.getMessage());
        }

        return datos;
    }

    private String[] columnas(String sql) {
        String c = "";
        // Se quita el SELECT y todo lo que sigue despues de FROM para dejar unicamente campos y alias
        String[] sqlLimpia = sql.replace("SELECT", "").replace(sql.substring(sql.indexOf("FROM"), sql.length()), "").split(",");
        // Separamos el campo del alias   usuarios.usuario as usuario
        // http://www.leepoint.net/notes-java/flow/loops/foreach.html   -> For in ...
        for (String uas : sqlLimpia) {
            c += (uas.substring((uas.indexOf("as") + 2), uas.length())).replace(" ", "") + ",";
        }
        // Se convierte la cadena en un arreglo para recorrerla
        return c.split(",");


    }

    protected void i(String e) {
        System.out.println(e);
    }

    public boolean sqlEjec(String sql) {
        try {
            bd.getConexion().setAutoCommit(true);
        } catch (SQLException ex) {
            ErrorInfo ed_infoError = new ErrorInfo("Error", "Error Agregando Auto Commit en Transaccion", null, "category", ex,
                    Level.CONFIG, null);
            JXErrorPane.showDialog(null, ed_infoError);
        }
        this.pt = null;
        boolean estado = false;
        try {
            pt = bd.getConexion().prepareStatement(sql);
            pt.execute();
            estado = true;
        } catch (SQLException e) {
            ErrorInfo ed_infoError = new ErrorInfo("Error", "Problemas Realizando envio de Información a la Base de Datos", null, "category", e,
                    Level.CONFIG, null);
            JXErrorPane.showDialog(null, ed_infoError);
            estado = false;
        }
        return estado;
    }
}
